#ifndef __INK_ATOMIC_H__
#define __INK_ATOMIC_H__

#if defined(__GNUC__) && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 1)) || (__GNUC__ >= 5))

/**
* 将value通过原子操作赋值给mem.
* 参数:mem(被赋值的变量的指针) value(值)
* 返回值:返回以前的value.
**/
template <typename T>
static inline T
ink_atomic_swap(volatile T *mem, T value)
{
	return __sync_lock_test_and_set(mem, value);
}

/**
* 比较并替换操作
* 只有在mem的值等于prev时,才会将next的值存放到mem指针所在的内存上
* 返回值:bool, next是否被存储到mem上.
*/
template <typename T>
static inline bool
ink_atomic_cas(volatile T *mem, T prev, T next)
{
	return __sync_bool_compare_and_swap(mem, prev, next);
}

/**
* 对mem的value进行原子加法操作,count为要增加的值
* 返回值:操作之前mem的value.
*/
template <typename Type, typename Amount>
static inline Type
ink_atomic_increment(volatile Type *mem, Amount count)
{
	return __sync_fetch_and_add(mem, (Type)count);
}

/**
* 对mem的value进行原子减法操作,count为要减去的值
* 返回值:操作之前的mem的value.
*/
template <typename Type, typename Amount>
static inline Type
ink_atomic_decrement(volatile Type *mem, Amount count)
{
	return __sync_fetch_and_sub(mem, (Type)count);
}

#endif

#endif
